package com.njbw.design_pattern.created.singleton;

/**
 * 饿汉式实现方式比较简单。
 * 在类加载的时候，instance 静态实例就已经创建并初始化好了，所以，instance 实例的创建过程是线程安全的。
 * <p/>
 * 这种方式的缺点是，如果这个类比较重，或者说这个类的实例化比较耗时，而这个类又不一定会被使用的话，
 * 那么就会造成资源的浪费。
 * <p>
 * 适用场景：类比较轻量级，或者类的实例化比较耗时，并且这个类一定会被使用。
 * <p/>
 * 事实上，饿汉式的写法在工作中反而应该被提倡，面试种不问，只是因为它简单。很多人觉得饿汉式不支持延迟加载，即使不使用也会浪费资源，一方面是内存资源，一方面会增加初始化的开销
 * 1.现代计算机不缺这一个对象的内存
 * 2.如果一个实例初始化的过程复杂那更加应该放在启动时处理，避免卡顿或者构造问题发生在运行时。满足 fail-fast 的设计原则
 * @author huang hou chun
 * @since JDK 1.8 <br>
 */
public class EagerSingleton {

    /**
     * 1.创建对象本身的复杂度
     *      很多单例对象创建的过程可能及其复杂：计算很复杂，存在很多很多 IO 对 CPU 压力，产生很多资源消耗
     *      很多单例对象创建完成后会占用很大内存，比如缓存对象
     *      很多单例对象创建完成后可能很小且很简单
     */

    // 私有化静态实例,类加载时创建,使用静态的特性来保证全局唯一性！！！
    // 因为类加载时天然是线程安全的，所以这种方式也是线程安全的，而 static 是类级别的，所以这种方式也保证了全局唯一性
    // 1.持有一个 JVM 全局唯一的实例
    private static final EagerSingleton INSTANCE = new EagerSingleton();

    // 2.为了避免别人随意的创建，我们需要私有化构造器
    private EagerSingleton() {}

    // 3.暴露一个方法，用来获取实例
    public static EagerSingleton getInstance() {
        return INSTANCE;
    }
}
